package edu.server.dominio;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import edu.server.repositorio.Producto;
import edu.server.repositorio.ProveedorDeProducto;
import edu.server.repositorio.ProveedorDeProductoId;
import edu.server.util.HibernateUtil;

public class D_ProveedorDeProducto {
	
	public D_ProveedorDeProducto()
	{
		
	}

	/**
	 * Método que elimina desrelaciona a los proveedores con un producto.
	 * @param producto. Producto para el cual se le quieren quitar todos los proveedores.
	 */
	@SuppressWarnings("unchecked")
	public void eliminarTodosProveedores(Producto producto)
	{
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		List<ProveedorDeProducto> proveedores;
		
		try
		{
			session.beginTransaction();
			
			Criteria criteria = session.createCriteria(ProveedorDeProducto.class);
			
			criteria.add(Restrictions.eq("producto", producto));
			
			//buscamos todos los proveedores que proveen al producto
			proveedores = criteria.list();
			
			//borramos los proveedores
			for(ProveedorDeProducto proveedor : proveedores)
				session.delete(proveedor);
			
			session.getTransaction().commit();
		}
		
		catch(HibernateException he)
		{
			session.getTransaction().rollback();
			throw he;
		}
	}
	
	/**
	 * Método que guarda en la base de datos un proveedor de un cierto producto.
	 * @param proveedorDeProducto. Es el proveedor de producto a registrar en la base de datos.
	 */
	public void registrarProveedorDeProducto(ProveedorDeProducto proveedorDeProducto)
	{
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		try
		{
			session.beginTransaction();
			
			session.saveOrUpdate(proveedorDeProducto);
			
			session.getTransaction().commit();
		}
		
		catch(HibernateException he)
		{
			session.getTransaction().rollback();
			throw he;
		}
	}
	
	/**
	 * Método que busca en la base de datos todos los proveedores de producto que proveen un determinado producto.
	 * @param producto. Producto para el cual se buscan todos sus proveedores.
	 * @return List<ProveedoresDeProducto>. Retorna la lista de proveedores de producto que proveen el producto pasado como parámetro. 
	 */
	@SuppressWarnings("unchecked")
	public List<ProveedorDeProducto> buscarProveedores(Producto producto)
	{
		List<ProveedorDeProducto> proveedoresDeProducto; 
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		Criteria criteria = session.createCriteria(ProveedorDeProducto.class);
		
		criteria.add(Restrictions.eq("producto", producto));
		
		proveedoresDeProducto = criteria.list();
		
		//inicializamos el proveedor para cada proveedor de producto
		for(ProveedorDeProducto proveedorDeProducto : proveedoresDeProducto)	
			Hibernate.initialize(proveedorDeProducto.getProveedor());		
		
		session.close();
		
		return proveedoresDeProducto;
	}
	
	/**
	 * Método que busca el precio de un producto para un proveedor determinado
	 * @param idProveedor. Proveedor del producto.
	 * @param idProducto. Producto para el cual se busca el precio.
	 * @return float. Retorna el precio del producto para el proveedor indicado.
	 */
	public double buscarPrecio(int idProveedor, int idProducto)
	{
		double precio;
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		String hql = "select precio " +
					 "from ProveedorDeProducto pdp " +
					 "where pdp.proveedor.codigoProveedor = " + idProveedor +
				     " and pdp.producto.idProducto = " + idProducto;
		
		precio = (double) session.createQuery(hql).uniqueResult();
		
		session.close();
		
		return precio;
	}
	
	
	/**
	 * Método que busca a un proveedor de producto por su id
	 * @param id. Id del proveedor de producto.
	 * @return ProveedorDeProducto. Retorna el proveedor de producto que tiene el id pasado como parámetro.
	 */
	public ProveedorDeProducto buscarProveedorDeProducto(ProveedorDeProductoId id)
	{
		ProveedorDeProducto proveedorDeProducto;
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		proveedorDeProducto = (ProveedorDeProducto) session.get(ProveedorDeProducto.class, id);
		
		session.close();
		
		return proveedorDeProducto;
		}
}
